package com.junjie.base.datasource.db;

/**
 * @Author Jun jie Yi
 * @Date 2022/3/8 17:07
 */

import com.alibaba.fastjson.JSONObject;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

public class JdbcTemplateTest {

    // 工具类，私有化无参构造函数
    public JdbcTemplateTest() {
    }

    /**
     * DML 操作模板方法
     *
     * @param sql       执行操作的 SQL 语句
     * @param arguments SQL 语句参数
     */
    public static int update(String sql, Object... arguments) {
        try (
                // 获取数据库连接 connection
                Connection connection = Druid.getConnection();
                // 创建数据库语句载体
                PreparedStatement pStatement = connection.prepareStatement(sql);
        ) {
            // 给预编译好的 sql 语句中的占位符进行赋值
            if (arguments != null && arguments.length > 0) {
                for (int i = 0; i < arguments.length; i++) {
                    pStatement.setObject(i + 1, arguments[i]);
                }
            }
            // 执行 SQL 语句
            return pStatement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return 0;
    }

    /**
     * 返回json数据
     * DDL操作模板
     *
     * @param sql
     * @param arguments
     * @return
     */
    public static List<JSONObject> query(String sql, Object... arguments) {
        ResultSet rSet = null;
        //处理器来确定T的类型
        BeanHandler<JSONObject> handler = new BeanHandler<>(JSONObject.class);
        try (
                Connection connection = Druid.getConnection();
                PreparedStatement pStatement = connection.prepareStatement(sql);
        ) {
            if (arguments != null && arguments.length > 0) {
                for (int i = 0; i < arguments.length; i++) {
                    pStatement.setObject(i + 1, arguments[i]);
                }
            }
            // 调用处理结果集类对数据库查询结果集进行装箱
            rSet = pStatement.executeQuery();
            return handler.handlerJson(rSet);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    public static List<?> query(String sql, Class<?> bean, Object... arguments) {
        IResultSetHandler<?> handler = new BeanHandler<>(bean);
        ResultSet rSet = null;
        try (
                Connection connection = Druid.getConnection();
                PreparedStatement pStatement = connection.prepareStatement(sql)
        ) {
            if (arguments != null && arguments.length > 0) {
                for (int i = 0; i < arguments.length; i++) {
                    pStatement.setObject(i + 1, arguments[i]);
                }
            }
            // 调用处理结果集类对数据库查询结果集进行装箱
            rSet = pStatement.executeQuery();
            return (List<?>) handler.handler(rSet);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                rSet.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
